import {fetchEventSource} from '@microsoft/fetch-event-source';
import {getToken} from "@/utils/auth";


//开启新对话
export function openNew(chatSession, callbacks = {}) {
    // 设置默认回调函数
    const {
        onStart = () => {
        },           // 开始连接时的回调
        onMessage = () => {
        },         // 收到消息时的回调
        onSessionId = () => {
        },       // 收到会话ID时的回调
        onComplete = () => {
        },        // 完成时的回调
        onError = () => {
        }            // 错误时的回调
    } = callbacks;

    // 创建控制器，用于可能需要取消请求
    const controller = new AbortController();

    // 调用开始回调
    onStart();

    // 创建结果收集器
    const results = {
        sessionId: null,
        content: '',
        completed: false,
        error: null
    };


    // 创建Promise
    const promise = new Promise((resolve, reject) => {
        fetchEventSource('/dev-api/chat/generate', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'Accept': 'text/event-stream',
                'Authorization': 'Bearer ' + getToken(),
                'Cache-Control': 'no-cache'
            },
            body: JSON.stringify(chatSession),
            signal: controller.signal,
            openWhenHidden: true,

            onopen(response) {
                // 记录响应头，便于调试
                console.log("响应状态:", response.status);
                console.log("Content-Type:", response.headers.get('content-type'));

                if (response.ok) {
                    return; // 成功就继续
                }
                const error = new Error(`SSE连接失败: ${response.status}`);
                onError(error);
                reject(error);
            },

            onmessage(event) {
                try {

                    if (event.data.includes("[START]")) {
                        results.sessionId = event.data.split("|")[1];
                        onSessionId(results.sessionId);
                        return;
                    }
                    // 检查是否结束
                    if (event.data.includes("[DONE]")) {
                        // 调用回调
                        onComplete();
                        // 处理Promise
                        results.completed = true;
                        resolve(results);
                        return;
                    }
                    // 处理正常消息
                    onMessage(event.data);

                    // 处理Promise
                    results.content += event.data;
                } catch (error) {
                    console.error("处理SSE消息出错:", error);
                    onError(error);
                    reject(error);
                }
            },

            onclose() {
                console.log("SSE连接已关闭");

                // 调用回调
                onComplete();

                // 处理Promise
                if (!results.completed && !results.error) {
                    results.completed = true;
                    resolve(results);
                }
            },

            onerror(err) {
                throw err;
            }
        }).catch(error => {
            console.error("发送消息失败:", error);
            onError(error);
            reject(error);
        });
    });

    // 返回包含promise和cancel方法的对象
    return {
        promise,
        cancel: () => {
            try {
                controller.abort();
                console.log("SSE请求已取消");
            } catch (error) {
                console.error("取消SSE请求失败:", error);
            }
        }
    };
}

export function sendMsg(chatSession, callbacks = {}) {
    // 设置默认回调函数
    const {
        onStart = () => {
        },           // 开始连接时的回调
        onSessionId = () => {
        },            // 错误时的回调
        onMessage = () => {
        },         // 收到消息时的回调
        onComplete = () => {
        },        // 完成时的回调
        onError = () => {
        }            // 错误时的回调
    } = callbacks;

    // 创建控制器，用于可能需要取消请求
    const controller = new AbortController();

    // 调用开始回调
    onStart();

    // 创建结果收集器
    const results = {
        sessionId: null,
        content: '',
        completed: false,
        error: null
    };


    // 创建Promise
    const promise = new Promise((resolve, reject) => {
        fetchEventSource('/dev-api/chat/conversation', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'Accept': 'text/event-stream',
                'Authorization': 'Bearer ' + getToken(),
                'Cache-Control': 'no-cache'
            },
            body: JSON.stringify(chatSession),
            signal: controller.signal,
            openWhenHidden: true,

            onopen(response) {
                // 记录响应头，便于调试
                console.log("响应状态:", response.status);
                console.log("Content-Type:", response.headers.get('content-type'));
                if (response.ok) {
                    return; // 成功就继续
                }
                const error = new Error(`SSE连接失败: ${response.status}`);
                onError(error);
                reject(error);
            },

            onmessage(event) {
                try {
                    if (event.data.includes("[START]")) {
                        results.sessionId = event.data.split("|")[1];
                        onSessionId(results.sessionId);
                        return;  //消息过滤
                    }
                    // 检查是否结束
                    if (event.data.includes("[DONE]")) {
                        // 调用回调
                        onComplete();
                        // 处理Promise
                        results.completed = true;
                        resolve(results);
                        return;
                    }
                    // 处理正常消息
                    onMessage(event.data);

                    // 处理Promise
                    results.content += event.data;
                } catch (error) {
                    console.error("处理SSE消息出错:", error);
                    onError(error);
                    reject(error);
                }
            },

            onclose() {
                console.log("SSE连接已关闭");

                // 调用回调
                onComplete();

                // 处理Promise
                if (!results.completed && !results.error) {
                    results.completed = true;
                    resolve(results);
                }
            },

            onerror(err) {
                throw err;
            }
        }).catch(error => {
            console.error("发送消息失败:", error);
            onError(error);
            reject(error);
        });
    });

    // 返回包含promise和cancel方法的对象
    return {
        promise,
        cancel: () => {
            try {
                controller.abort();
                console.log("SSE请求已取消");
            } catch (error) {
                console.error("取消SSE请求失败:", error);
            }
        }
    };
}